package com.cskaoyan.javase.recursion._1basic;

/**
 * @description: 递归的思想
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 引例：
 * ​	使用递归计算N（N>=1）的阶乘
 *
 * n! = n * (n-1) * (n-2) *...* 1
 * n! = n * (n-1)!
 * (n-1)! = (n-1) * (n-2)!
 * ... 这个分解过程不是无限制的
 * 2! = 2 * 1!
 * 1! = 1
 * 递归的思想：分解问题的思想
 * 1. 把一个复杂的大规模的问题，分解成若干相似的小规模的子问题
 * 2. 当子问题规模足够小的时候，就可以直接得到小规模问题的解
 * 3. 然后把所有的小规模的子问题的解，组合起来
 * 4. 最终得到大规模问题的解
 *
 * 写递归调用的过程：
 *      1，先写递归的出口
 *      2，写递归体（在方法中调用自身的语句）
 *
 * 总结一下递归的优缺点
 * 优点：
 *      1，代码简洁，优雅
 *      2，递归的思想符合人解决问题的思维，非常容易想到
 * 缺点：
 *      1，递归很危险，很容易出现栈溢出错误
 *      2，递归的时空复杂度都很差，即耗费多的内存空间，执行效率也很低
 *以上，在实际开发中，因为递归的缺点过于明显，所以尽量不要使用它（但是有时不得不使用）
 *
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(factorial(6));
    }

    //递归求n的阶乘
    public static long factorial(int n) {
        //1的阶乘是1，作为递归的出口
        if (n == 1) {
            return 1;
        }
        //递归体
        return n * factorial(n - 1);
    }
}
